#include "CRC.h"

uint16_t CRC16_CCITT(const uint8_t* data, uint16_t length) 
{
    // 初始化CRC值为0xFFFF，这是CRC16_CCITT标准的起始值。
    uint16_t crc = 0xFFFF;  

    // 遍历缓冲区中的每个字节。
    for (int i = 0; i < length; ++i) 
	{
        // 将当前字节与CRC值的高8位进行异或操作。
        crc ^= data[i] << 8;
        // 对每个字节处理8次，对应8位。
        for (int j = 0; j < 8; ++j) 
		{
            // 检查CRC值的最高位是否为1。
            if (crc & 0x8000) {
                // 如果最高位为1，将CRC值左移1位后与多项式0x1021进行异或。
                crc = (crc << 1) ^ 0x1021;
            } else {
                // 如果最高位不为1，仅将CRC值左移1位。
                crc <<= 1;
            }
        }
    }

    // 返回计算得到的CRC校验和。
    return crc;
}


